package top.csy8888.ch02.websocket;

import jakarta.websocket.OnClose;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author CSY
 * @date 2025 - 09 - 18
 * configurator属性设置握手处理器
 */
@ServerEndpoint(value = "/chat",configurator = HandshakeHandler.class)
public class WebSocketServer {
    /**
     * 使用Map集合维护一个用户列表
     * key是连接session的id
     * value是客户端session对象
     */
    private final static Map<String,Session> sessionMap = new HashMap<>();

    /**
     * 用户上线
     * 每当由用户连接时，创建的session就保存到用户列表中
     * @param session
     * @throws IOException
     */
    @OnOpen
    public void onOpen(Session session) throws IOException {
        //获取用户信息
        String user = (String) session.getUserProperties().get("user");
        sessionMap.put(user,session);
    }

    /**
     * 接收客户端发送的消息并执行群发（发送给所有的session）
     * @param message
     * @param session
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        String user = (String) session.getUserProperties().get("user");
        sendAllUser(user+":"+message);
    }

    /**
     * 群发
     * @param message
     */
    public void sendAllUser(String message) {
        sessionMap.forEach((id,session)->{
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                throw new RuntimeException("发送失败:"+e);
            }
        });
    }

    /**
     * 用户离线
     * @param session
     * @throws IOException
     */
    @OnClose
    public void onClose(Session session) throws IOException {
        String user = (String) session.getUserProperties().get("user");
        sessionMap.remove(user);
    }
}
